Spring–基础解析
了解spring
- spring是为了简化企业级开发而提出的一个开源框架,它特有的轻量级以及非侵入式特点使得其可以自由组合各个功能模块
- spring的ioc是实现非侵入式的主要部分(主要跳过配置进行依赖注入)
IOC(控制反转、依赖注入)
- 在传统的java开发模式中,我们需要使用new来创建一个对象然后才能获取其属性或使用其方法,而spring通过工厂模式为我们创建了所需要的对象,可以直接进行取用,这就是控制反转的思想
- 但是为什么不直接用工厂模式而引入IOC这个概念呢?spring的非侵入性,这是通过反射机制来实现的,以动态的方式来提供各种功能是实现其非侵入式的主要原因。如果我们单纯使用工厂类那么在功能扩展或者需求改动时需要改动其核心代码。而spring通过反射配合beanFactory来实现对象的创建以及属性注入,这样就避免了重复编码的问题。
AOP(面向切面编程)
OOP中我们将所有事物看成一个对象,在AOP中我们关注的不再是对象了,而是切面和切点
如果说所有的业务逻辑代码看作是一个面,以日志记录为例(权限控制和事务管理同上),我们就需要在n多个方法这种写入日志输出的代码段(重复工作且浪费资源)
这里简单介绍一下注解来实现aop的简单示例:
- @Aspect来声明这是一个切面类
- @Before来声明before为一个前置通知(后置,环绕,异常,最终通知同理)
- excution来声明一个切点
- 大致过程如下:
- Before–执行前通知,除非抛出异常才会不执行
- After–执行后通知,正常执行后运行除非抛出异常
- AfterThrowing–异常后运行
- Around–方法调用前后运行
- AfterRetirning–方法最终返回时运行
1
2
3
4
5
6public class Advice(){
public void before(){
syso("this is a before advice");
}
}
常用注解
@Autowired:对类的成员变量,方法,构造函数进行自动装配,如
@Autowired
private ArticleService articeService
@Repository:用于标注数据访问组件,通常在dao层的实现类中使用
@Service:用于标注业务层组件,通常在service层的实现类中使用
@Controller:用于标注控制层组件,通常在controller层使用
@RequestMapping:用于标识控制器拦截内容,通常在controller类中使用
@RequestMapping("xxxx")
@RequestParam:将请求参数绑定到方法参数
@RequestParam(value="userID",defaultValue="1" Long userID)
@RequestBody:接受http请求的json数据并转换成java对象(springMVC中注解)
@ResponseBody:将controller类方法返回对象转换成json给相应的客户(springMVC注解)
spring Bean生命周期
- 初始化Bean开始
- 反射调用Bean的构造方法实例化Bean
- 通过反射注入Bean的属性值
- Aware注入,如:
BeanNameAware
,BeanClassLoaderAware
- 调用每个调用BeanPostProcessor接口的postProcessBeforeInitialization方法
- 调用初始化方法
- 调用每个调用BeanPostProcessor接口的postProcessAfterInitialization方法
- 注册需要执行销毁方法的Bean
- 初始化Bean结束
spring能帮忙做什么
- 根据配置文件来创建以及组装对象之间的依赖关系,当这个关系发生改变时,我们只需要改动配置文件即可
- 通过AOP来为我们实现无耦合的日志记录,权限管理,安全控制,性能统计
- 非常简单地帮助管理数据库事务,我们只需要获取连接执行sql就行,其他地都是spring操作,本身也提供jdbc访问模板
- 除了自身提供的一套web框架springmvc,还可以无缝集成其他的web框架